const sql = require("../../mysql");

module.exports = async ctx => {
  try {
    const { parentId, idArray } = ctx.request.body;

    // 思路：移动文件以及文件夹，只需把 parentId 改为当前的 parentId 即可
    // 在此之前需要验证目标文件夹是否在该文件夹下或者是否为当前文件夹

    let parentFolder = await sql.Vfile.findOne({
      where: {
        id: parentId
      }
    });

    if (!parentFolder) {
      ctx.body = {
        code: -1,
        msg: "未找到 id 为 " + parentId + " 的文件夹"
      };
      return;
    }

    if (parentId && !parentFolder.isFolder) {
      ctx.body = {
        code: -1,
        msg: "传入目标必须是文件夹"
      };
      return;
    }

    // 验证
    if (idArray.includes(parentId)) {
      ctx.body = {
        code: -1,
        msg: "不能移动或复制到选中文件夹目录下"
      };
      return;
    }

    // 验证
    async function validateList(idGroup) {
      return new Promise(async (resolve, reject) => {
        for (let index = 0; index < idGroup.length; index++) {
          const pid = idGroup[index];

          let fileList = await sql.Vfile.findAll({
            where: {
              parentId: pid
            }
          });

          fileList = fileList.filter(e => e.isFolder).map(e => e.id);

          if (fileList.includes(parentId)) {
            reject("不能移动或复制到选中文件夹目录下");
          } else {
            if (fileList && fileList.length) {
              try {
                await validateList(fileList);
              } catch (error) {
                reject(error);
              }
            }
            resolve();
          }
        }
      });
    }

    try {
      await validateList(idArray);
    } catch (error) {
      console.log(error);
      ctx.body = {
        code: -1,
        msg: "不能移动或复制到选中文件夹目录下"
      };
      return;
    }

    // 移动
    // 将 idArray 内包含的文件夹以及文件的 parentId 改为传入的 parentId

    let res = await sql.Vfile.update(
      { parentId },
      {
        where: {
          id: {
            [sql.Op.in]: idArray
          }
        }
      }
    );

    console.log(res);

    ctx.body = {
      code: 0,
      msg: "成功"
    };
    return;
  } catch (error) {
    console.log(error);
    ctx.response.status = 200;

    ctx.body = {
      code: -1,
      msg: error.errors ? error : error.errors[0].message
    };
  }
};
